Skip to content

[feature](s3) Support S3 Express One Zone for S3 TVF and Broker Load#65504

Open
0AyanamiRei wants to merge 21 commits into
apache:masterfrom
0AyanamiRei:take-over-63409
Open

[feature](s3) Support S3 Express One Zone for S3 TVF and Broker Load#65504
0AyanamiRei wants to merge 21 commits into
apache:masterfrom
0AyanamiRei:take-over-63409

Conversation

@0AyanamiRei

@0AyanamiRei 0AyanamiRei commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: None

Related PR: #63409

Problem Summary:

Doris import paths need to read existing Amazon S3 Express One Zone directory buckets with AWS SDK-managed session authentication and zonal endpoint resolution.

This PR supports S3 Express through the existing Doris S3 import entry points:

  • SELECT ... FROM S3(...).
  • INSERT INTO ... SELECT ... FROM S3(...).
  • Broker Load using WITH S3.

No new storage object or user-managed short-term credential is introduced. Users keep configuring the long-term AWS credential path already supported by Doris, and the AWS SDK creates and refreshes the S3 Express session credentials.

Supported URI forms

S3 Express is selected when s3.provider (or provider) is explicitly AWS and the request uses a complete directory-bucket name, <bucket-base>--<zone-id>--x-s3.

The supported input forms are:

  1. A canonical S3 Express Object URL:

    https://<bucket-base>--<zone-id>--x-s3.s3express-<zone-id>.<region>.amazonaws.com/<key>
    

    For S3 TVF, Doris derives s3.region from this URL when it is omitted. Doris normalizes the URL to s3://<directory-bucket>/<key> before file discovery and execution.

  2. The existing S3 URI form:

    s3://<bucket-base>--<zone-id>--x-s3/<key>
    

    This form requires s3.region as before.

Broker Load still requires a shared s3.region in WITH S3, because its BrokerDesc is created before the DATA INFILE paths and can be shared by multiple paths. Multiple Object URLs in the same Region are supported; a URL whose Region conflicts with the shared configuration is rejected.

For a complete Object URL, Doris validates HTTPS, the canonical virtual-hosted endpoint form, the directory-bucket name, matching bucket/endpoint Zone IDs, matching URL/configured Regions, and use_path_style=false. Canonical non-dualstack Object URLs are supported; dualstack URLs are rejected because the dualstack hostname choice is not propagated after URI normalization.

s3.endpoint may be omitted. The Express clients ignore endpoint overrides and let the AWS SDK derive the zonal data endpoint from the complete directory-bucket name, so an endpoint retained for ordinary S3 configuration does not conflict with Express imports.

Implementation

  • There is no statement-local flag or hidden S3_EXPRESS_IMPORT_READ property. S3 TVF SELECT and INSERT INTO SELECT use the same construction path.
  • FE file discovery and reads (ListObjectsV2, HeadObject, and GetObject) select the SDK-managed Express client for AWS directory buckets.
  • Directory-bucket listing uses slash-terminated prefixes and continuation tokens and does not use unsupported StartAfter requests.
  • BE uses the AWS SDK S3 endpoint provider with S3 Express authentication enabled, HTTPS, and virtual-hosted addressing.
  • Broker Load keeps its normal BrokerDesc and replay path; complete Object URLs are normalized through the same typed S3 property path.
  • Ordinary S3 and non-AWS S3-compatible providers keep their existing client and endpoint behavior.
  • The supported and tested user-facing scope is importing existing objects; this PR does not add a storage-creation or export interface.

Release note

Support importing existing Amazon S3 Express One Zone objects through S3 TVF queries, INSERT INTO ... SELECT ... FROM S3(...), and Broker Load WITH S3, using either a canonical S3 Express Object URL or a directory-bucket s3:// URI.

Check List (For Author)

  • Test

    • Regression test
      • Added aws_s3_express_p0/test_s3_express_import, gated by enableS3ExpressOneZoneTest, for canonical Object URLs, s3:// URIs, S3 TVF, INSERT INTO SELECT, Broker Load, CSV, Parquet, ORC, multi-path/glob discovery, and 1001-object pagination.
      • The expected .out must be generated on a real AWS directory bucket with -genOut, then verified by a second run without -genOut.
    • Unit Test
      • ./run-fe-ut.sh --run org.apache.doris.datasource.property.storage.S3PropertiesTest,org.apache.doris.tablefunction.ExternalFileTableValuedFunctionTest,org.apache.doris.nereids.trees.plans.commands.LoadCommandTest (37 tests passed)
      • ./run-fe-ut.sh --run org.apache.doris.tablefunction.ExternalFileTableValuedFunctionTest (4 tests passed after the final file-list path assertion)
    • Manual test
    • A live AWS directory-bucket CreateSession -> List/Get integration test has not run yet; Regression and Manual remain unchecked until the AWS run passes and the generated .out is committed.
  • Behavior changed:

    • Yes. AWS directory buckets automatically select the S3 Express client in the supported S3 import paths, and canonical S3 Express Object URLs are accepted and validated.
  • Does this need documentation?

    • Yes. A follow-up documentation PR should describe the URI forms, Broker Load Region requirement, and supported import entry points.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

yinzixin and others added 3 commits July 13, 2026 09:22
### What problem does this PR solve?\n\nIssue Number: close #xxx\n\nRelated PR: apache#63409\n\nProblem Summary: The initial S3 Express implementation detected directory buckets and endpoints with broad substring matches in two separate locations. This could classify ordinary bucket names or endpoint paths as S3 Express and allowed the client configuration and upload checksum behavior to diverge. Centralize the decision in one helper, require the documented --x-s3 bucket suffix or an s3express endpoint host label, and pass the resulting context into the object storage client. Add unit coverage for valid and invalid names.\n\n### Release note\n\nNone\n\n### Check List (For Author)\n\n- Test: Unit Test (S3UTILTest.is_s3_express_context; ASAN UT rebuild started)\n- Behavior changed: No, except avoiding false-positive S3 Express detection\n- Does this need documentation: No
@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@0AyanamiRei
0AyanamiRei marked this pull request as ready for review July 13, 2026 01:38
### What problem does this PR solve?

Issue Number: N/A

Related PR: apache#63409

Problem Summary: Document a production-ready design for S3 Express One Zone on Doris. The design audits the current PR, defines service-aware bucket capabilities, preserves ordinary S3 endpoint behavior, completes checksum and multipart flows across BE and FE, specifies unordered listing compatibility, rejects unsupported Cloud and Hadoop surfaces before I/O or persistence, and provides test, rollout, and data rollback gates.

### Release note

None

### Check List (For Author)

- Test: No need to test (documentation-only change; validated with git diff --cached --check and source-path consistency checks)

- Behavior changed: No

- Does this need documentation: No (this commit is the implementation design)
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: Add end-to-end S3 Express One Zone Directory Bucket support across native BE and FE S3 paths. Use SDK-managed session authentication and zonal endpoint routing, CRC32C multipart propagation, Directory Bucket listing semantics, active multipart cleanup, and fail-fast gates for unsupported Cloud Storage Vault and Hadoop/S3A surfaces while preserving ordinary S3-compatible behavior.

### Release note

Add native S3 Express One Zone Directory Bucket support for Doris S3 file access. Cloud Storage Vault, Hadoop/S3A-backed external surfaces, and presigned URLs remain unsupported and fail fast.

### Check List (For Author)

- Test: Test code added but not run per request
- Behavior changed: Yes. Official AWS Directory Buckets use SDK-managed Express session authentication, CRC32C, and Directory Bucket listing semantics; unsupported surfaces fail fast.
- Does this need documentation: Yes, goal.md
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: Document how the S3 Express One Zone design maps to the implemented BE, FE, Hive, Cloud boundary, checksum, multipart, listing, and fail-fast changes. Record compatibility behavior, unexecuted tests, and remaining validation gaps so the implementation status is not confused with GA acceptance.

### Release note

None

### Check List (For Author)

- Test: No need to test (documentation-only change)
- Behavior changed: No
- Does this need documentation: Yes, this commit adds the implementation summary
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: The previous S3 Express implementation expanded Directory Bucket awareness across listing, deletion, presigning, connectors, Cloud storage, checksums, and documentation. This change narrows support to official AWS endpoints and valid --x-s3 bucket names on Doris native known-object paths. AWS SDK endpoint rules provide the zonal endpoint and CreateSession authentication, Express clients use HTTPS and virtual-hosted addressing, Head/Get/range/Put and multipart create/upload/complete/abort are supported, exact S3 TVF and S3 Load paths use HeadObject, and Express uploads no longer send Content-MD5. General-purpose S3 and S3-compatible endpoints retain their existing client behavior.

### Release note

Support native known-object reads and writes for Amazon S3 Express One Zone Directory Buckets.

### Check List (For Author)

- Test: Not run (per user request)
- Behavior changed: Yes. Official AWS Directory Buckets use SDK S3 Express routing and session authentication for native known-object operations.
- Does this need documentation: Yes. The user documentation will be handled separately.
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: Align S3 Express support with the documented known-object contract. Only valid AWS Directory Buckets using a standard HTTPS regional endpoint, a matching region, and virtual-hosted-style access enable SDK endpoint rules and CreateSession. Exact S3 TVF and Broker Load paths use HeadObject and reject glob, range, query, empty-key, and directory-prefix inputs. Third-party S3-compatible endpoints retain conventional S3 authentication and checksum behavior even when a bucket name ends in --x-s3. BE known-object uploads omit Content-MD5 for Directory Buckets. Remove the prior generic Java operation and BE abort expansions. The existing SDK versions already provide the required endpoint and session APIs, so no SDK upgrade is included.

### Release note

Support known-object access to Amazon S3 Express One Zone through native S3 paths.

### Check List (For Author)

- Test: Not run (per user request)
- Behavior changed: Yes. Valid AWS Directory Buckets use S3 Express session authentication for known-object access; unsupported listing and glob semantics are not enabled.
- Does this need documentation: Yes. The user documentation is handled separately.
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: Synchronize the S3 Express branch with the latest master so the import-layer refactor and its unit tests use the current S3 filesystem interfaces.

### Release note

None

### Check List (For Author)

- Test: No need to test (base branch synchronization only)
- Behavior changed: No
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: Amazon S3 Express One Zone directory buckets require directory-bucket listing rules and SDK-managed session authentication, while the existing S3 import paths used regular S3 clients. Scope the capability to one-shot INSERT SELECT from the S3 table-valued source and Broker Load WITH S3, validate native AWS directory-bucket context, select Express clients for discovery and reads, and preserve ordinary, third-party, legacy, and non-target import behavior.

### Release note

Support importing from Amazon S3 Express One Zone directory buckets through one-shot INSERT SELECT S3 sources and Broker Load WITH S3.

### Check List (For Author)

- Test: Unit Test
    - FE core targeted unit tests
    - FE filesystem targeted unit tests
    - BE targeted unit tests
- Behavior changed: Yes, S3 Express reads are enabled only for the two scoped S3 import entry points.
- Does this need documentation: Yes (follow-up documentation PR pending)
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: The previous S3 Express implementation inferred directory-bucket behavior from user endpoints and changed generic S3/import abstractions beyond the intended feature. This refactor limits S3 Express selection to trusted one-shot INSERT SELECT and Broker Load read paths with an explicit AWS provider and a complete directory bucket name. Doris ignores the user endpoint for these scoped reads, derives known Regions from the bucket Zone ID, falls back to an unchecked user Region for future Zone prefixes, and lets the AWS SDK resolve the zonal endpoint and manage S3 Express session credentials. Ordinary S3 and non-target import, catalog, resource, storage, and write paths retain their existing behavior.

### Release note

Add S3 Express One Zone read support for one-shot INSERT SELECT from S3 and Broker Load with S3. Provide the complete directory bucket name and AWS provider; endpoint is ignored, while region is used only as an unchecked fallback for an unknown Zone prefix.

### Check List (For Author)

- Test: Unit Test
    - BE S3ClientFactoryTest: 12 tests passed
    - FE targeted S3 Express and import tests: 196 tests passed
- Behavior changed: Yes. Only the scoped S3 import reads select SDK-managed S3 Express endpoint and session authentication.
- Does this need documentation: Yes. The PR description documents the supported entry points and configuration contract.
### What problem does this PR solve?

Issue Number: None

Related PR: apache#63409

Problem Summary: The S3 Express statement-scope gate only admitted INSERT INTO SELECT and excluded a direct SELECT from the same S3 TVF, even though both statements share the same FE listing and BE read path. The gate also called Command.getType() for a real InsertIntoTableCommand, but Command does not implement that method. Recognize only the exact one-shot InsertIntoTableCommand and the parser's UnboundResultSink for a direct SELECT. This keeps CTAS, INSERT OVERWRITE, OUTFILE, COPY, FILE TVF, Streaming, internal commands, and specialized INSERT subclasses outside the trusted S3 Express marker boundary.

### Release note

Support reading an Amazon S3 Express One Zone directory bucket with a direct SELECT from S3(...) in addition to INSERT INTO ... SELECT ... FROM S3(...) and Broker Load WITH S3.

### Check List (For Author)

- Test: Unit Test
    - ./run-fe-ut.sh --run org.apache.doris.common.util.S3URITest,org.apache.doris.datasource.property.storage.S3PropertiesTest,org.apache.doris.fs.FileSystemFactoryS3ExpressScopeTest,org.apache.doris.load.loadv2.BrokerLoadJobTest,org.apache.doris.nereids.trees.plans.commands.LoadCommandTest,org.apache.doris.tablefunction.ExternalFileTableValuedFunctionTest,org.apache.doris.qe.S3ExpressImportScopeTest (58 tests passed)
- Behavior changed: Yes. Direct one-shot SELECT from the S3 TVF can select the scoped S3 Express read client; non-target entry points remain excluded.
- Does this need documentation: Yes. The PR description documents the supported entry points and configuration contract.
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: S3 Express import requests whose bucket clearly uses the --x-s3 suffix could silently fall back to generic S3-compatible provider detection when the statement scope, provider, or directory bucket format was invalid. This produced misleading MinIO or ordinary S3 errors. FE list failures also lost AWS service details and incorrectly implied a specific CreateSession or ListObjectsV2 stage. Recognize S3 Express intent before fallback, validate only the supported import entry points, and preserve HTTP status, AWS error code, message, and request ID with joint operation context.

### Release note

S3 Express import requests now report clear scope, provider, bucket-format, and FE service errors instead of silently falling back to ordinary S3-compatible handling.

### Check List (For Author)

- Test: Unit Test
    - FE unit tests for S3 Express intent validation, TVF and Broker Load scope, and S3 filesystem error reporting
- Behavior changed: Yes. Invalid S3 Express import requests now fail with feature-specific diagnostics.
- Does this need documentation: No
@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run buildall

### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: FileSystemFactoryS3ExpressScopeTest used nonstandard line wrapping in the ASF license header. FE Checkstyle rejected the header and blocked the Compile, FE UT, and Performance pipelines before fe-core compilation. Align the file with the repository standard ASF header.

### Release note

None

### Check List (For Author)

- Test: Unit Test
    - Debug FE build: ./build.sh --fe -j48
    - FE UT: ./run-fe-ut.sh --run org.apache.doris.fs.FileSystemFactoryS3ExpressScopeTest
- Behavior changed: No
- Does this need documentation: No
@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 80.27% (118/147) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 29372 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 276bd1e997e253e3cfa747dfc566105aeb6def3f, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17720	4084	4015	4015
q2	2019	335	211	211
q3	10282	1430	859	859
q4	4690	470	339	339
q5	7553	860	570	570
q6	177	165	136	136
q7	788	809	604	604
q8	9354	1523	1552	1523
q9	5977	4375	4355	4355
q10	6829	1742	1486	1486
q11	516	359	325	325
q12	710	579	470	470
q13	18051	3311	2727	2727
q14	286	266	248	248
q15	q16	796	771	705	705
q17	1042	1024	938	938
q18	7095	5693	5460	5460
q19	1293	1316	1131	1131
q20	798	700	567	567
q21	5978	2544	2412	2412
q22	440	359	291	291
Total cold run time: 102394 ms
Total hot run time: 29372 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4378	4350	4284	4284
q2	279	316	215	215
q3	4561	4950	4426	4426
q4	2065	2168	1355	1355
q5	4369	4268	4303	4268
q6	234	179	126	126
q7	1767	1939	1913	1913
q8	2564	2171	2192	2171
q9	7993	8078	7845	7845
q10	4717	4646	4252	4252
q11	566	414	369	369
q12	737	766	528	528
q13	3341	3610	2976	2976
q14	288	289	276	276
q15	q16	693	723	635	635
q17	1359	1336	1485	1336
q18	7756	7474	7227	7227
q19	1124	1100	1099	1099
q20	2197	2195	1931	1931
q21	5274	4532	4448	4448
q22	518	452	394	394
Total cold run time: 56780 ms
Total hot run time: 52074 ms

@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 29275 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 0ab94409236da66bba45b3f275e8375120dcc1b0, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17837	4241	4051	4051
q2	2042	311	206	206
q3	10279	1435	836	836
q4	4684	477	336	336
q5	7528	838	581	581
q6	185	188	136	136
q7	772	822	637	637
q8	9345	1571	1535	1535
q9	5705	4317	4322	4317
q10	6766	1726	1459	1459
q11	522	375	328	328
q12	715	577	443	443
q13	18090	3274	2736	2736
q14	266	272	240	240
q15	q16	797	790	701	701
q17	988	1018	995	995
q18	6890	5754	5486	5486
q19	1354	1310	1075	1075
q20	781	712	603	603
q21	5875	2662	2278	2278
q22	431	356	296	296
Total cold run time: 101852 ms
Total hot run time: 29275 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4400	4350	4342	4342
q2	282	318	206	206
q3	4557	4939	4357	4357
q4	2065	2164	1376	1376
q5	4400	4276	4305	4276
q6	238	180	128	128
q7	1747	1843	1857	1843
q8	2532	2184	2178	2178
q9	7968	8157	7731	7731
q10	4712	4615	4191	4191
q11	570	409	385	385
q12	795	757	554	554
q13	3214	3637	2913	2913
q14	301	312	304	304
q15	q16	712	747	665	665
q17	1372	1340	1345	1340
q18	8019	7351	7348	7348
q19	1193	1127	1129	1127
q20	2217	2226	1922	1922
q21	5261	4650	4536	4536
q22	518	454	421	421
Total cold run time: 57073 ms
Total hot run time: 52143 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 178136 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 0ab94409236da66bba45b3f275e8375120dcc1b0, data reload: false

query5	4316	649	491	491
query6	475	227	206	206
query7	4908	581	351	351
query8	340	192	176	176
query9	8778	3993	4043	3993
query10	467	361	307	307
query11	5883	2329	2144	2144
query12	165	101	98	98
query13	1304	609	439	439
query14	6249	5194	4876	4876
query14_1	4247	4226	4202	4202
query15	220	202	179	179
query16	998	471	464	464
query17	920	702	580	580
query18	2433	484	348	348
query19	221	190	151	151
query20	112	108	108	108
query21	232	160	140	140
query22	13533	13533	13354	13354
query23	17278	16509	16228	16228
query23_1	16212	16264	16147	16147
query24	7551	1771	1299	1299
query24_1	1291	1273	1285	1273
query25	569	478	403	403
query26	1357	379	220	220
query27	2548	602	391	391
query28	4527	1985	1961	1961
query29	1069	638	492	492
query30	339	274	234	234
query31	1137	1094	990	990
query32	121	64	69	64
query33	581	332	265	265
query34	1167	1147	654	654
query35	778	784	671	671
query36	1196	1184	1057	1057
query37	159	117	94	94
query38	1878	1707	1638	1638
query39	869	918	873	873
query39_1	837	849	828	828
query40	239	159	141	141
query41	62	66	64	64
query42	90	90	92	90
query43	321	322	277	277
query44	1415	741	747	741
query45	192	194	176	176
query46	1074	1158	705	705
query47	2115	2129	1988	1988
query48	401	402	286	286
query49	588	417	301	301
query50	1114	442	317	317
query51	10947	11092	11071	11071
query52	89	88	74	74
query53	253	286	192	192
query54	277	228	213	213
query55	74	70	63	63
query56	302	277	294	277
query57	1324	1293	1214	1214
query58	268	261	253	253
query59	1575	1620	1420	1420
query60	308	276	253	253
query61	151	145	152	145
query62	544	498	437	437
query63	242	203	205	203
query64	2813	1039	930	930
query65	4623	4612	4612	4612
query66	1840	505	412	412
query67	29319	29154	29027	29027
query68	3178	1525	1028	1028
query69	410	310	264	264
query70	1024	979	922	922
query71	364	345	315	315
query72	3035	2684	2337	2337
query73	865	806	455	455
query74	5084	4887	4719	4719
query75	2542	2507	2133	2133
query76	2330	1168	748	748
query77	356	375	283	283
query78	11935	11820	11369	11369
query79	1373	1196	774	774
query80	1285	548	478	478
query81	520	339	289	289
query82	619	160	121	121
query83	404	320	295	295
query84	332	162	126	126
query85	972	618	516	516
query86	412	295	274	274
query87	1828	1818	1733	1733
query88	3719	2745	2768	2745
query89	442	374	332	332
query90	1937	202	195	195
query91	198	197	159	159
query92	62	59	54	54
query93	1709	1480	947	947
query94	708	373	293	293
query95	789	505	491	491
query96	1064	805	340	340
query97	2607	2631	2513	2513
query98	212	205	199	199
query99	1091	1110	1009	1009
Total cold run time: 263575 ms
Total hot run time: 178136 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 25.14 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 0ab94409236da66bba45b3f275e8375120dcc1b0, data reload: false

query1	0.01	0.01	0.01
query2	0.09	0.05	0.05
query3	0.25	0.13	0.13
query4	1.61	0.14	0.14
query5	0.24	0.26	0.21
query6	1.27	1.10	1.08
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.38	0.30	0.32
query10	0.59	0.56	0.53
query11	0.18	0.13	0.14
query12	0.18	0.14	0.14
query13	0.48	0.47	0.49
query14	1.02	0.99	1.01
query15	0.60	0.59	0.59
query16	0.31	0.34	0.31
query17	1.07	1.12	1.14
query18	0.22	0.21	0.22
query19	2.08	2.01	1.96
query20	0.02	0.01	0.01
query21	15.43	0.21	0.14
query22	4.96	0.06	0.05
query23	16.11	0.31	0.12
query24	2.85	0.42	0.34
query25	0.11	0.05	0.04
query26	0.75	0.20	0.16
query27	0.03	0.04	0.04
query28	3.58	0.90	0.54
query29	12.49	4.11	3.31
query30	0.27	0.15	0.14
query31	2.77	0.58	0.31
query32	3.22	0.60	0.49
query33	3.19	3.21	3.14
query34	15.69	4.27	3.59
query35	3.55	3.53	3.59
query36	0.54	0.44	0.41
query37	0.09	0.07	0.07
query38	0.06	0.04	0.03
query39	0.04	0.03	0.03
query40	0.18	0.15	0.17
query41	0.09	0.03	0.03
query42	0.03	0.02	0.02
query43	0.05	0.04	0.03
Total cold run time: 96.78 s
Total hot run time: 25.14 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 84.04% (79/94) 🎉
Increment coverage report
Complete coverage report

@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run p0

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 82.09% (55/67) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 74.96% (30486/40669)
Line Coverage 59.14% (336228/568557)
Region Coverage 55.85% (281965/504900)
Branch Coverage 57.23% (125319/218982)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 82.09% (55/67) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 74.96% (30487/40669)
Line Coverage 59.13% (336208/568557)
Region Coverage 55.84% (281951/504900)
Branch Coverage 57.23% (125314/218982)

### What problem does this PR solve?

Issue Number: N/A

Related PR: apache#65504

Problem Summary: The S3 Express implementation used a hidden import-read marker and statement-scoped state to select Express clients. That made standalone SELECT FROM S3(...) differ from INSERT INTO SELECT, required BrokerDesc reconstruction after replay, and left some FE read operations on the regular S3 client. Detect S3 Express from the explicit AWS provider and complete directory bucket name instead, propagate the provider through the standard S3 property path, and use the Express client consistently for import read operations and directory-bucket listing semantics.

### Release note

S3 TVF queries, INSERT INTO SELECT, and Broker Load can read from Amazon S3 Express One Zone directory buckets using SDK-managed session credentials.

### Check List (For Author)

- Test: No tests run, as requested
- Behavior changed: Yes; S3 Express selection is automatic for AWS directory buckets across supported S3 read paths
- Does this need documentation: No
@0AyanamiRei 0AyanamiRei changed the title [feature](s3) Support S3 Express import reads [feature](s3) Support S3 Express One Zone for S3 TVF and Broker Load Jul 20, 2026
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: Doris S3 Express imports accepted directory-bucket S3 URIs but did not accept the canonical Object URL exposed by AWS. Add typed parsing and validation for complete S3 Express Object URLs, derive the Region for S3 TVF, normalize URLs before file discovery, and validate multi-path Broker Load input against its shared Region. This keeps SELECT from S3, INSERT INTO SELECT, and Broker Load on the same existing import path without a hidden feature marker.

### Release note

Support canonical Amazon S3 Express One Zone Object URLs for S3 TVF and Broker Load imports.

### Check List (For Author)

- Test: Unit Test
    - ./run-fe-ut.sh --run org.apache.doris.datasource.property.storage.S3PropertiesTest,org.apache.doris.tablefunction.ExternalFileTableValuedFunctionTest,org.apache.doris.nereids.trees.plans.commands.LoadCommandTest
    - ./run-fe-ut.sh --run org.apache.doris.tablefunction.ExternalFileTableValuedFunctionTest
- Behavior changed: Yes; canonical S3 Express Object URLs are validated and normalized for S3 TVF and Broker Load imports.
- Does this need documentation: Yes; the PR description records the supported URI forms and configuration contract.
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: The Code Formatter workflow reported one clang-format mismatch in the S3 Express client configuration test. Apply the formatter-required line wrapping without changing behavior.

### Release note

None

### Check List (For Author)

- Test: No need to test; formatting-only change verified by build-support/check-format.sh
- Behavior changed: No
- Does this need documentation: No
@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 29891 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17612	4072	4086	4072
q2	2008	327	199	199
q3	10312	1489	843	843
q4	4683	474	341	341
q5	7520	850	564	564
q6	183	175	138	138
q7	789	834	618	618
q8	9364	1603	1631	1603
q9	5655	4424	4386	4386
q10	6774	1735	1485	1485
q11	520	359	330	330
q12	728	595	473	473
q13	18067	3515	2797	2797
q14	272	265	241	241
q15	q16	776	775	713	713
q17	1001	1006	1058	1006
q18	6961	5765	5628	5628
q19	1317	1355	1122	1122
q20	787	682	553	553
q21	5949	2699	2475	2475
q22	437	365	304	304
Total cold run time: 101715 ms
Total hot run time: 29891 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4495	4435	4383	4383
q2	325	324	223	223
q3	4629	4982	4435	4435
q4	2067	2132	1392	1392
q5	4434	4266	4272	4266
q6	234	177	128	128
q7	1784	2151	1702	1702
q8	2585	2221	2220	2220
q9	7987	8082	7772	7772
q10	4673	4675	4259	4259
q11	572	431	394	394
q12	757	775	546	546
q13	3273	3591	2988	2988
q14	287	302	282	282
q15	q16	720	726	668	668
q17	1418	1352	1340	1340
q18	7994	7276	7290	7276
q19	1148	1135	1096	1096
q20	2211	2211	1940	1940
q21	5250	4556	4404	4404
q22	505	457	405	405
Total cold run time: 57348 ms
Total hot run time: 52119 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 177477 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

query5	4323	634	495	495
query6	474	225	202	202
query7	4973	605	346	346
query8	345	184	170	170
query9	8760	4154	4111	4111
query10	496	381	318	318
query11	5931	2351	2134	2134
query12	166	106	104	104
query13	1262	632	464	464
query14	6256	5262	4918	4918
query14_1	4278	4238	4248	4238
query15	220	207	180	180
query16	999	466	448	448
query17	950	737	602	602
query18	2439	482	349	349
query19	220	196	157	157
query20	109	108	116	108
query21	234	161	138	138
query22	13589	13578	13332	13332
query23	17447	16558	16110	16110
query23_1	16209	16235	16282	16235
query24	7514	1774	1287	1287
query24_1	1334	1314	1272	1272
query25	576	480	404	404
query26	1340	371	216	216
query27	2573	593	360	360
query28	4469	2031	2016	2016
query29	1083	632	518	518
query30	340	264	224	224
query31	1124	1092	981	981
query32	111	67	63	63
query33	528	326	268	268
query34	1159	1154	652	652
query35	775	775	695	695
query36	1175	1159	1075	1075
query37	158	115	98	98
query38	1893	1718	1665	1665
query39	877	880	887	880
query39_1	834	819	828	819
query40	242	160	149	149
query41	65	63	65	63
query42	97	93	91	91
query43	337	339	289	289
query44	1403	777	763	763
query45	207	192	175	175
query46	1109	1232	717	717
query47	2074	2078	1934	1934
query48	425	406	284	284
query49	574	412	312	312
query50	1096	433	344	344
query51	11048	10977	10739	10739
query52	86	88	82	82
query53	274	275	199	199
query54	287	231	217	217
query55	75	73	65	65
query56	286	294	295	294
query57	1333	1276	1194	1194
query58	286	260	254	254
query59	1605	1624	1429	1429
query60	323	279	254	254
query61	147	137	141	137
query62	539	492	431	431
query63	245	206	201	201
query64	2842	1062	846	846
query65	4722	4677	4628	4628
query66	1838	510	399	399
query67	29388	29299	28489	28489
query68	3070	1507	1043	1043
query69	414	303	271	271
query70	1090	949	951	949
query71	361	334	304	304
query72	3029	2712	2348	2348
query73	838	782	455	455
query74	5037	4906	4689	4689
query75	2540	2520	2141	2141
query76	2317	1201	791	791
query77	353	386	279	279
query78	11900	11858	11353	11353
query79	1453	1151	756	756
query80	1265	546	474	474
query81	544	339	290	290
query82	621	158	122	122
query83	373	330	312	312
query84	331	158	130	130
query85	976	607	529	529
query86	417	298	271	271
query87	1834	1833	1774	1774
query88	3774	2784	2782	2782
query89	439	395	334	334
query90	1925	202	197	197
query91	205	185	163	163
query92	62	60	56	56
query93	1698	1520	961	961
query94	718	344	314	314
query95	794	526	567	526
query96	1081	771	363	363
query97	2628	2636	2482	2482
query98	209	203	197	197
query99	1099	1109	976	976
Total cold run time: 264223 ms
Total hot run time: 177477 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 25.06 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

query1	0.00	0.00	0.00
query2	0.12	0.04	0.05
query3	0.25	0.14	0.14
query4	1.61	0.14	0.14
query5	0.23	0.22	0.21
query6	1.19	1.04	1.03
query7	0.04	0.01	0.01
query8	0.05	0.04	0.03
query9	0.40	0.33	0.32
query10	0.56	0.55	0.60
query11	0.19	0.14	0.14
query12	0.18	0.15	0.15
query13	0.48	0.47	0.47
query14	1.03	1.02	1.01
query15	0.62	0.59	0.59
query16	0.31	0.32	0.33
query17	1.10	1.13	1.11
query18	0.22	0.21	0.22
query19	2.09	1.98	2.00
query20	0.01	0.01	0.01
query21	15.43	0.21	0.13
query22	4.82	0.05	0.05
query23	16.13	0.30	0.13
query24	2.93	0.41	0.33
query25	0.11	0.05	0.04
query26	0.74	0.21	0.16
query27	0.05	0.04	0.04
query28	3.53	0.90	0.54
query29	12.55	4.17	3.31
query30	0.27	0.15	0.16
query31	2.77	0.59	0.32
query32	3.22	0.61	0.50
query33	3.22	3.09	3.28
query34	15.49	4.21	3.49
query35	3.54	3.51	3.54
query36	0.56	0.45	0.43
query37	0.08	0.07	0.07
query38	0.05	0.05	0.04
query39	0.03	0.04	0.03
query40	0.18	0.16	0.16
query41	0.08	0.03	0.03
query42	0.04	0.03	0.02
query43	0.04	0.04	0.03
Total cold run time: 96.54 s
Total hot run time: 25.06 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 74.97% (30511/40700)
Line Coverage 59.12% (336455/569082)
Region Coverage 56.00% (283052/505478)
Branch Coverage 57.27% (125600/219331)

@0AyanamiRei

Copy link
Copy Markdown
Contributor Author

run buildall

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 29541 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17639	4037	4011	4011
q2	2048	320	200	200
q3	10264	1381	834	834
q4	4677	464	336	336
q5	7530	845	554	554
q6	179	165	134	134
q7	742	829	618	618
q8	9974	1585	1546	1546
q9	6139	4364	4332	4332
q10	6794	1712	1468	1468
q11	504	346	316	316
q12	755	565	448	448
q13	18142	3317	2772	2772
q14	264	254	240	240
q15	q16	790	782	705	705
q17	978	915	965	915
q18	7052	5729	5611	5611
q19	1418	1336	1112	1112
q20	800	700	602	602
q21	5834	2559	2495	2495
q22	426	355	292	292
Total cold run time: 102949 ms
Total hot run time: 29541 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4382	4311	4304	4304
q2	299	317	213	213
q3	4575	4939	4439	4439
q4	2066	2147	1357	1357
q5	4358	4247	4290	4247
q6	230	172	124	124
q7	1732	2087	1681	1681
q8	2494	2125	2106	2106
q9	7873	7812	7786	7786
q10	4638	4672	4182	4182
q11	578	413	372	372
q12	763	929	554	554
q13	3284	3515	2976	2976
q14	308	309	282	282
q15	q16	749	751	648	648
q17	1371	1329	1343	1329
q18	7990	7395	6860	6860
q19	1127	1113	1078	1078
q20	2187	2195	1945	1945
q21	5188	4485	4356	4356
q22	514	467	407	407
Total cold run time: 56706 ms
Total hot run time: 51246 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 177002 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

query5	4320	616	472	472
query6	466	216	229	216
query7	4860	611	342	342
query8	334	188	177	177
query9	8779	4053	4024	4024
query10	475	365	302	302
query11	5914	2315	2119	2119
query12	162	103	102	102
query13	1277	614	436	436
query14	6253	5163	4886	4886
query14_1	4230	4195	4225	4195
query15	210	204	177	177
query16	1015	465	459	459
query17	1125	713	571	571
query18	2443	482	349	349
query19	205	189	154	154
query20	113	107	110	107
query21	242	165	134	134
query22	13481	13444	13299	13299
query23	17276	16524	16236	16236
query23_1	16225	16253	16162	16162
query24	7679	1778	1292	1292
query24_1	1310	1272	1286	1272
query25	572	465	397	397
query26	1344	362	213	213
query27	2597	597	369	369
query28	4490	1941	1972	1941
query29	1125	626	498	498
query30	343	263	227	227
query31	1125	1107	986	986
query32	104	64	61	61
query33	526	324	258	258
query34	1183	1138	664	664
query35	767	774	656	656
query36	1191	1162	1027	1027
query37	164	111	98	98
query38	1833	1694	1677	1677
query39	903	877	845	845
query39_1	849	828	827	827
query40	269	205	136	136
query41	64	65	62	62
query42	93	92	90	90
query43	321	326	273	273
query44	1456	783	733	733
query45	204	177	174	174
query46	1070	1170	774	774
query47	2143	2128	2045	2045
query48	422	433	293	293
query49	590	401	309	309
query50	1068	437	329	329
query51	10805	11008	10889	10889
query52	86	93	76	76
query53	253	270	192	192
query54	289	229	213	213
query55	76	70	63	63
query56	310	300	290	290
query57	1330	1282	1185	1185
query58	282	253	273	253
query59	1612	1617	1413	1413
query60	312	269	252	252
query61	148	154	148	148
query62	558	497	441	441
query63	235	200	197	197
query64	2812	1037	878	878
query65	4728	4644	4594	4594
query66	1824	496	412	412
query67	29304	29165	28979	28979
query68	3107	1565	965	965
query69	401	295	266	266
query70	1038	965	956	956
query71	375	364	315	315
query72	3008	2643	2397	2397
query73	788	809	444	444
query74	5049	4864	4742	4742
query75	2543	2494	2109	2109
query76	2319	1171	778	778
query77	349	370	280	280
query78	11920	11856	11257	11257
query79	1433	1195	763	763
query80	1275	556	466	466
query81	528	326	288	288
query82	591	160	122	122
query83	361	317	297	297
query84	272	155	133	133
query85	951	615	512	512
query86	418	289	269	269
query87	1830	1813	1767	1767
query88	3758	2767	2756	2756
query89	439	376	323	323
query90	1894	196	189	189
query91	200	197	166	166
query92	62	57	58	57
query93	1713	1544	914	914
query94	720	343	324	324
query95	818	467	565	467
query96	1130	821	348	348
query97	2623	2631	2502	2502
query98	215	203	197	197
query99	1086	1114	963	963
Total cold run time: 263603 ms
Total hot run time: 177002 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.83 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 94b1dc5a83c91534aedfaab4d9b1c368fb6e8520, data reload: false

query1	0.01	0.01	0.00
query2	0.08	0.05	0.06
query3	0.26	0.13	0.13
query4	1.61	0.13	0.14
query5	0.26	0.22	0.21
query6	1.23	1.05	1.05
query7	0.04	0.00	0.00
query8	0.07	0.04	0.04
query9	0.39	0.31	0.30
query10	0.55	0.56	0.54
query11	0.19	0.13	0.14
query12	0.18	0.14	0.14
query13	0.47	0.47	0.48
query14	1.02	1.00	1.00
query15	0.61	0.58	0.59
query16	0.31	0.32	0.33
query17	1.10	1.08	1.12
query18	0.22	0.21	0.21
query19	2.02	1.93	1.97
query20	0.02	0.01	0.01
query21	15.43	0.21	0.12
query22	4.92	0.05	0.05
query23	16.11	0.29	0.11
query24	3.00	0.42	0.31
query25	0.11	0.04	0.03
query26	0.73	0.20	0.14
query27	0.03	0.03	0.04
query28	3.55	0.88	0.53
query29	12.49	4.10	3.27
query30	0.27	0.16	0.15
query31	2.77	0.57	0.31
query32	3.22	0.59	0.48
query33	3.12	3.18	3.21
query34	15.44	4.19	3.49
query35	3.54	3.57	3.52
query36	0.56	0.43	0.44
query37	0.09	0.07	0.06
query38	0.05	0.04	0.03
query39	0.04	0.03	0.03
query40	0.19	0.17	0.16
query41	0.08	0.04	0.03
query42	0.04	0.03	0.02
query43	0.04	0.04	0.03
Total cold run time: 96.46 s
Total hot run time: 24.83 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 83.54% (66/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 57.51% (23998/41725)
Line Coverage 41.24% (236138/572611)
Region Coverage 37.03% (186487/503589)
Branch Coverage 38.27% (83893/219189)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 74.97% (30511/40700)
Line Coverage 59.12% (336469/569082)
Region Coverage 55.98% (282983/505478)
Branch Coverage 57.27% (125609/219331)

1 similar comment
@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 74.97% (30511/40700)
Line Coverage 59.12% (336469/569082)
Region Coverage 55.98% (282983/505478)
Branch Coverage 57.27% (125609/219331)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 75.04% (30540/40700)
Line Coverage 59.20% (336878/569082)
Region Coverage 56.00% (283049/505478)
Branch Coverage 57.35% (125789/219331)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 75.04% (30540/40700)
Line Coverage 59.19% (336858/569082)
Region Coverage 55.97% (282896/505478)
Branch Coverage 57.35% (125782/219331)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 73.42% (58/79) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 75.03% (30539/40700)
Line Coverage 59.20% (336876/569082)
Region Coverage 55.98% (282955/505478)
Branch Coverage 57.35% (125789/219331)

0AyanamiRei and others added 3 commits July 21, 2026 10:34
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: The S3 Express One Zone import change had unit coverage but no end-to-end regression suite for a real AWS directory bucket. Add an explicitly gated manual suite covering canonical Object URLs, s3:// URIs, S3 TVF, INSERT INTO SELECT, Broker Load, CSV, Parquet, ORC, multi-path and glob discovery, and ListObjectsV2 continuation over 1001 objects. Add a fixture preparation script that only uploads to a new prefix in an existing bucket and never creates or deletes storage.

### Release note

None

### Check List (For Author)

- Test: Manual test preparation
    - Groovy suite compiled with the regression framework Groovy compiler
    - bash -n and a stubbed fixture-script smoke test passed
    - Live AWS regression is pending and must generate the .out file with -genOut
- Behavior changed: No
- Does this need documentation: No
### What problem does this PR solve?

Issue Number: None

Related PR: apache#65504

Problem Summary: Directory bucket ListObjectsV2 responses are not lexicographically ordered and do not support key-based StartAfter pagination. Doris consumed these pages as though they had general-purpose bucket ordering, which could break deterministic glob results and streaming cursors. Broker Load also created a job before exercising the s3express:CreateSession path. Exhaust directory-bucket pages, sort raw keys globally in UTF-8 binary order, and apply cursors and limits on the client. Validate directory-list request constraints, perform a bounded Express read check before job submission, reuse one filesystem across pending paths, and consolidate duplicated bucket, provider, prefix, and client-selection logic.

### Release note

S3 Express directory-bucket imports now return deterministic file ordering and validate read access before Broker Load job creation.

### Check List (For Author)

- Test: Unit Test (coverage added and updated; execution intentionally skipped at the user request)
- Behavior changed: Yes (directory listings are globally ordered and Broker Load validates S3 Express read access before submission)
- Does this need documentation: No
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants